/*
 * @(#)XfvhdlBinaryDecimal.java        3.0                    2004/09/14
 *
 * This file is part of Xfuzzy 3.0, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfvhdl;

import java.io.*;

/**
* Clase que convierte valores entre los formatos decimal y binario.
* @author Jos� Mar�a �vila Maireles, <b>e-mail</b>: josavimai@alum.us.es
* @version 3.0
*/
public class XfvhdlBinaryDecimal {

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //				M�TO_DOS P�BLICOS DE LA CLASE			        
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

   /** 
   * M�todo que pasa una cadena de 0's y 1's (numero en binario) a un 
   * entero.
   * @param s Cadena de 0's y 1's.
   * @return Entero correspondiente.
   */
   public int toDecimal(String s) throws IOException {
      int a = 0;
      int n = s.length();

      for (int i = 0; i < n; i++) {
         char c = s.charAt(i);
         a *= 2;
         a += toDecimal(c);
      }

      return a;
   }

   /** 
   * M�todo que pasa de un entero a un String de 0's y 1's (numero en 
   * binario) con una precisi�n de l bits.
   * @param n Entero que queremos pasar a binario.
   * @param l Precisi�n de la transformaci�n.
   * @return Cadena de 0's y 1's que representa el n�mero en binario.
   */
   public String toBinary(int n, int l) {
      String binary = new String(Integer.toBinaryString(n));
      String ceros = new String();

      if (binary.length() < l) {
         for (int i = 0; i < l - binary.length(); i++) {
            ceros += "0";
         }

         binary = ceros + binary;
      } else if (binary.length() > l) {
         binary = binary.substring(binary.length() - l);
      }

      return binary;
   }

   /** 
   * M�todo que pasa de un double a un String de 0's y 1's (numero en 
   * binario) con una precisi�n de l bits dentro de del rango min-max.
   * @param valor Double que queremos pasar a binario.
   * @param min M�nimo del rango.
   * @param max M�ximo del rango.
   * @param p Precisi�n de la transformaci�n.
   * @return Cadena de 0's y 1's que representa el n�mero en binario.
   */
   public String toBinaryInRange(
      double valor,
      double min,
      double max,
      int p) {
      double max_bin;
      int res;

      max_bin = Math.pow((double) 2, (double) p) - 1;

      res = (int) ((max_bin * (valor - min)) / (max - min));

      String binary = new String(Integer.toBinaryString(res));
      String ceros = new String();

      if (binary.length() < p) {
         for (int i = 0; i < p - binary.length(); i++) {
            ceros += "0";
         }

         binary = ceros + binary;
      } else if (binary.length() > p) {
         binary = binary.substring(binary.length() - p);
      }

      return binary;
   }

   /** 
   * M�todo que genera un String con n guiones ("-") para las cl�usulas 
   * others.
   * @param n N�mero de guiones a generar.
   * @return Cadena de guiones.
   */
   public String toHyphen(int n) {
      String hyphens = new String();

      for (int i = 0; i < n; i++)
         hyphens += "-";

      return hyphens;
   }

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //			  M�TO_DOS PRIVADOS DE LA CLASE				        
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

   /**
   * M�todo privado que pasa de un char (0 o 1) a un entero.
   * @param c Car�cter a pasar a binario. 
   */
   private int toDecimal(char c) throws IOException {
      switch (c) {
         case '0' :
            return 0;
         case '1' :
            return 1;
         default :
            throw new IOException("non digit: " + c);
      }
   }

} // Fin de la clase.
